{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "28fd5b27",
   "metadata": {},
   "source": [
    "# Global Forecasting Models: Dependent multi-series forecasting (Multivariate forecasting)\n",
    "\n",
    "[Univariate time series forecasting](../introduction-forecasting/introduction-forecasting.html) focuses on modeling a single time series as a linear or nonlinear function of its own past values (lags), using historical observations to predict future ones.\n",
    "\n",
    "**Global forecasting** builds a single predictive model that considers all time series simultaneously. This approach seeks to learn the shared patterns that underlie the different series, helping to reduce the influence of noise present in individual time series. It is computationally efficient, easier to maintain, and often yields more robust generalization across series.\n",
    "\n",
    "In **dependent multi-series forecasting** (also known as **multivariate time series forecasting**), all series are modeled jointly under the assumption that each series depends not only on its own past values, but also on the past values of the other series. The forecaster is expected to learn both the individual dynamics of each series and the relationships between them.\n",
    "\n",
    "A typical example is the set of sensor readings (such as flow, temperature, and pressure) collected from an industrial machine like a compressor, where the variables influence each other over time.\n",
    "\n",
    "<p style=\"text-align: center\">\n",
    "<img src=\"../img/forecaster_multivariate_train_matrix_diagram.png\" style=\"width: 600px\">\n",
    "<br>\n",
    "<font size=\"2.5\"> <i>Internal Forecaster time series transformation to train a forecaster with multiple dependent time series.</i></font>\n",
    "</p>\n",
    "\n",
    "Since a separate training matrix is created for each series in the dataset, it is necessary to define the **target level** on which forecasting will be performed. To predict the next n steps, one model is trained for each forecast horizon step. In the example shown, the selected level is `Series 1`.\n",
    "\n",
    "This approach corresponds to a [direct multi-step forecasting strategy](../introduction-forecasting/introduction-forecasting.html#direct-multi-step-forecasting), where each step is predicted independently using a separate model.\n",
    "\n",
    "<p style=\"text-align: center\">\n",
    "<img src=\"../img/forecaster_multivariate_prediction_diagram.png\" style=\"width: 600px\">\n",
    "<br>\n",
    "<font size=\"2.5\"> <i>Diagram of direct forecasting with multiple dependent time series.</i></font>\n",
    "</p>\n",
    "\n",
    "Using the <code>ForecasterDirectMultiVariate</code> class, it is possible to easily build machine learning models for **multivariate forecasting**."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31e9dfb7",
   "metadata": {},
   "source": [
    "<div class=\"admonition note\" name=\"html-admonition\" style=\"background: rgba(0,191,191,.1); padding-top: 0px; padding-bottom: 6px; border-radius: 8px; border-left: 8px solid #00bfa5; border-color: #00bfa5; padding-left: 10px; padding-right: 10px;\">\n",
    "\n",
    "<p class=\"title\">\n",
    "    <i style=\"font-size: 18px; color:#00bfa5;\"></i>\n",
    "    <b style=\"color: #00bfa5;\">&#128161 Tip</b>\n",
    "</p>\n",
    "\n",
    "<b>Why can only one series be predicted?</b>\n",
    "\n",
    "Direct forecasting strategies face a <b>scalability challenge</b>.\n",
    "\n",
    "To predict multiple time series and multiple time steps, you would need a <b>separate model for each series and each future time step</b>. For example, with 1,000 series and a forecast horizon of 24, this would require training 24,000 individual models, a computationally impractical approach.\n",
    "\n",
    "That’s why the <code>ForecasterDirectMultiVariate</code> can <b>learn from multiple series</b>, but can only predict one series at a time.\n",
    "\n",
    "<b>Looking for true multivariate with multiple series?</b>\n",
    "\n",
    "Try our <a href=\"../user_guides/forecasting-with-deep-learning-rnn-lstm.html\"><code>ForecasterRnn</code></a> class, which can handle <b>multivariate forecasting with multiple series</b> and multiple steps in a single deep learning model.\n",
    "\n",
    "</div>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "833f168e",
   "metadata": {},
   "source": [
    "<div class=\"admonition note\" name=\"html-admonition\" style=\"background: rgba(0,184,212,.1); padding-top: 0px; padding-bottom: 6px; border-radius: 8px; border-left: 8px solid #00b8d4; border-color: #00b8d4; padding-left: 10px; padding-right: 10px;\">\n",
    "\n",
    "<p class=\"title\">\n",
    "    <i style=\"font-size: 18px; color:#00b8d4;\"></i>\n",
    "    <b style=\"color: #00b8d4;\">&#9998 Note</b>\n",
    "</p>\n",
    "\n",
    "Skforecast offers additional approaches to create Global Forecasting Models:\n",
    "\n",
    "<ul>\n",
    "    <li>\n",
    "    <a href=\"../user_guides/independent-multi-time-series-forecasting.html\">Global Forecasting Models: Independent multi-series forecasting</a>\n",
    "    </li>\n",
    "    <li>\n",
    "    <a href=\"../user_guides/multi-series-with-different-length-and-different_exog.html\">Global Forecasting Models: Time series with different lengths and different exogenous variables</a>\n",
    "    </li>\n",
    "    <li>\n",
    "    <a href=\"../user_guides/forecasting-with-deep-learning-rnn-lstm.html\">Global Forecasting Models: Forecasting with Deep Learning</a>\n",
    "    </li>\n",
    "</ul>\n",
    "\n",
    "\n",
    "To learn more about global forecasting models visit our examples:\n",
    "\n",
    "<ul>\n",
    "    <li>\n",
    "    <a href=\"https://www.cienciadedatos.net/documentos/py44-multi-series-forecasting-skforecast.html\">Global Forecasting Models: Multi-series forecasting with Python and skforecast</a>\n",
    "    </li>\n",
    "    <li>\n",
    "    <a href=\"https://www.cienciadedatos.net/documentos/py59-scalable-forecasting-models.html\">Scalable Forecasting: Modeling thousand time series with a single global model</a>\n",
    "    </li>\n",
    "    <li>\n",
    "    <a href=\"https://cienciadedatos.net/documentos/py53-global-forecasting-models\">Global Forecasting Models: Comparative Analysis of Single and Multi-Series Forecasting Modeling</a>\n",
    "    </li>\n",
    "    <li>\n",
    "    <a href=\"https://cienciadedatos.net/documentos/py54-forecasting-with-deep-learning\">Forecasting with Deep Learning</a>\n",
    "    </li>\n",
    "</ul>\n",
    "\n",
    "</div>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "77a4bb4b",
   "metadata": {},
   "source": [
    "## Libraries and data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b15fba42",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-09-20T10:50:15.488670Z",
     "start_time": "2022-09-20T10:50:15.468737Z"
    }
   },
   "outputs": [],
   "source": [
    "# Libraries\n",
    "# ==============================================================================\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from lightgbm import LGBMRegressor\n",
    "from sklearn.metrics import mean_absolute_error\n",
    "from skforecast.datasets import fetch_dataset\n",
    "from skforecast.preprocessing import RollingFeatures\n",
    "from skforecast.direct import ForecasterDirectMultiVariate\n",
    "from skforecast.model_selection import (\n",
    "    OneStepAheadFold,\n",
    "    TimeSeriesFold,\n",
    "    backtesting_forecaster_multiseries,\n",
    "    grid_search_forecaster_multiseries,\n",
    "    random_search_forecaster_multiseries,\n",
    "    bayesian_search_forecaster_multiseries\n",
    ")\n",
    "from skforecast.plot import set_dark_theme"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "0c0024f6-5d9b-4e0d-a332-dfb71280d7e3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-09-20T09:48:03.761722Z",
     "start_time": "2022-09-20T09:48:02.297714Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">╭──────────────────────── <span style=\"font-weight: bold\">air_quality_valencia_no_missing</span> ─────────────────────────╮\n",
       "│ <span style=\"font-weight: bold\">Description:</span>                                                                     │\n",
       "│ Hourly measures of several air chemical pollutant at Valencia city (Avd.         │\n",
       "│ Francia) from 2019-01-01 to 20213-12-31. Including the following variables:      │\n",
       "│ pm2.5 (µg/m³), CO (mg/m³), NO (µg/m³), NO2 (µg/m³), PM10 (µg/m³), NOx (µg/m³),   │\n",
       "│ O3 (µg/m³), Veloc. (m/s), Direc. (degrees), SO2 (µg/m³). Missing values have     │\n",
       "│ been imputed using linear interpolation.                                         │\n",
       "│                                                                                  │\n",
       "│ <span style=\"font-weight: bold\">Source:</span>                                                                          │\n",
       "│ Red de Vigilancia y Control de la Contaminación Atmosférica, 46250047-València - │\n",
       "│ Av. França, https://mediambient.gva.es/es/web/calidad-ambiental/datos-           │\n",
       "│ historicos.                                                                      │\n",
       "│                                                                                  │\n",
       "│ <span style=\"font-weight: bold\">URL:</span>                                                                             │\n",
       "│ https://raw.githubusercontent.com/skforecast/skforecast-                         │\n",
       "│ datasets/main/data/air_quality_valencia_no_missing.csv                           │\n",
       "│                                                                                  │\n",
       "│ <span style=\"font-weight: bold\">Shape:</span> 43824 rows x 10 columns                                                   │\n",
       "╰──────────────────────────────────────────────────────────────────────────────────╯\n",
       "</pre>\n"
      ],
      "text/plain": [
       "╭──────────────────────── \u001b[1mair_quality_valencia_no_missing\u001b[0m ─────────────────────────╮\n",
       "│ \u001b[1mDescription:\u001b[0m                                                                     │\n",
       "│ Hourly measures of several air chemical pollutant at Valencia city (Avd.         │\n",
       "│ Francia) from 2019-01-01 to 20213-12-31. Including the following variables:      │\n",
       "│ pm2.5 (µg/m³), CO (mg/m³), NO (µg/m³), NO2 (µg/m³), PM10 (µg/m³), NOx (µg/m³),   │\n",
       "│ O3 (µg/m³), Veloc. (m/s), Direc. (degrees), SO2 (µg/m³). Missing values have     │\n",
       "│ been imputed using linear interpolation.                                         │\n",
       "│                                                                                  │\n",
       "│ \u001b[1mSource:\u001b[0m                                                                          │\n",
       "│ Red de Vigilancia y Control de la Contaminación Atmosférica, 46250047-València - │\n",
       "│ Av. França, https://mediambient.gva.es/es/web/calidad-ambiental/datos-           │\n",
       "│ historicos.                                                                      │\n",
       "│                                                                                  │\n",
       "│ \u001b[1mURL:\u001b[0m                                                                             │\n",
       "│ https://raw.githubusercontent.com/skforecast/skforecast-                         │\n",
       "│ datasets/main/data/air_quality_valencia_no_missing.csv                           │\n",
       "│                                                                                  │\n",
       "│ \u001b[1mShape:\u001b[0m 43824 rows x 10 columns                                                   │\n",
       "╰──────────────────────────────────────────────────────────────────────────────────╯\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Data download\n",
    "# ==============================================================================\n",
    "data = fetch_dataset(name=\"air_quality_valencia_no_missing\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2686f0f5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Shape:  (1826, 10)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>so2</th>\n",
       "      <th>co</th>\n",
       "      <th>no</th>\n",
       "      <th>no2</th>\n",
       "      <th>pm10</th>\n",
       "      <th>nox</th>\n",
       "      <th>o3</th>\n",
       "      <th>veloc.</th>\n",
       "      <th>direc.</th>\n",
       "      <th>pm2.5</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>datetime</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-01</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>0.141667</td>\n",
       "      <td>17.375000</td>\n",
       "      <td>37.250000</td>\n",
       "      <td>21.458333</td>\n",
       "      <td>63.458333</td>\n",
       "      <td>20.291667</td>\n",
       "      <td>0.416667</td>\n",
       "      <td>207.416667</td>\n",
       "      <td>17.208333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-02</th>\n",
       "      <td>6.041667</td>\n",
       "      <td>0.170833</td>\n",
       "      <td>23.458333</td>\n",
       "      <td>49.333333</td>\n",
       "      <td>26.416667</td>\n",
       "      <td>85.041667</td>\n",
       "      <td>11.708333</td>\n",
       "      <td>0.579167</td>\n",
       "      <td>225.375000</td>\n",
       "      <td>17.375000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-03</th>\n",
       "      <td>5.916667</td>\n",
       "      <td>0.216667</td>\n",
       "      <td>41.291667</td>\n",
       "      <td>53.250000</td>\n",
       "      <td>36.166667</td>\n",
       "      <td>116.333333</td>\n",
       "      <td>9.833333</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>211.833333</td>\n",
       "      <td>21.625000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-04</th>\n",
       "      <td>5.458333</td>\n",
       "      <td>0.204167</td>\n",
       "      <td>21.208333</td>\n",
       "      <td>45.750000</td>\n",
       "      <td>32.208333</td>\n",
       "      <td>77.958333</td>\n",
       "      <td>15.166667</td>\n",
       "      <td>0.675000</td>\n",
       "      <td>199.583333</td>\n",
       "      <td>22.166667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-05</th>\n",
       "      <td>4.541667</td>\n",
       "      <td>0.191667</td>\n",
       "      <td>10.291667</td>\n",
       "      <td>36.375000</td>\n",
       "      <td>32.875000</td>\n",
       "      <td>51.833333</td>\n",
       "      <td>21.083333</td>\n",
       "      <td>0.875000</td>\n",
       "      <td>254.208333</td>\n",
       "      <td>24.916667</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 so2        co         no        no2       pm10         nox  \\\n",
       "datetime                                                                      \n",
       "2019-01-01  6.000000  0.141667  17.375000  37.250000  21.458333   63.458333   \n",
       "2019-01-02  6.041667  0.170833  23.458333  49.333333  26.416667   85.041667   \n",
       "2019-01-03  5.916667  0.216667  41.291667  53.250000  36.166667  116.333333   \n",
       "2019-01-04  5.458333  0.204167  21.208333  45.750000  32.208333   77.958333   \n",
       "2019-01-05  4.541667  0.191667  10.291667  36.375000  32.875000   51.833333   \n",
       "\n",
       "                   o3    veloc.      direc.      pm2.5  \n",
       "datetime                                                \n",
       "2019-01-01  20.291667  0.416667  207.416667  17.208333  \n",
       "2019-01-02  11.708333  0.579167  225.375000  17.375000  \n",
       "2019-01-03   9.833333  0.500000  211.833333  21.625000  \n",
       "2019-01-04  15.166667  0.675000  199.583333  22.166667  \n",
       "2019-01-05  21.083333  0.875000  254.208333  24.916667  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Aggregate at daily frequency to reduce dimensions\n",
    "# ==============================================================================\n",
    "data = data.resample('D').mean()\n",
    "print(\"Shape: \", data.shape)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9eca9251",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-09-20T09:48:06.136685Z",
     "start_time": "2022-09-20T09:48:06.122785Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train dates : 2019-01-01 00:00:00 --- 2023-05-31 00:00:00  (n=1612)\n",
      "Test dates  : 2023-06-01 00:00:00 --- 2023-12-31 00:00:00  (n=214)\n"
     ]
    }
   ],
   "source": [
    "# Split data into train-val-test\n",
    "# ==============================================================================\n",
    "end_train = '2023-05-31 23:59:59'\n",
    "data_train = data.loc[:end_train, :].copy()\n",
    "data_test  = data.loc[end_train:, :].copy()\n",
    "\n",
    "print(\n",
    "    f\"Train dates : {data_train.index.min()} --- {data_train.index.max()}  \"\n",
    "    f\"(n={len(data_train)})\"\n",
    ")\n",
    "print(\n",
    "    f\"Test dates  : {data_test.index.min()} --- {data_test.index.max()}  \"\n",
    "    f\"(n={len(data_test)})\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2c0ee344",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-09-20T09:48:45.616852Z",
     "start_time": "2022-09-20T09:48:45.150172Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x500 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot time series\n",
    "# ==============================================================================\n",
    "set_dark_theme()\n",
    "fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(8, 5), sharex=True)\n",
    "for i, col in enumerate(data.columns[:3]):\n",
    "    data_train[col].plot(ax=axes[i], label='train')\n",
    "    data_test[col].plot(ax=axes[i], label='test')\n",
    "    axes[i].set_ylabel('Concentration(ug/m^3)', fontsize=8)\n",
    "    axes[i].set_title(col)\n",
    "    axes[i].legend(loc='upper right')\n",
    "\n",
    "fig.tight_layout()\n",
    "plt.show();"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "9801a209-b601-4d9b-aa3c-a2e03df98c98",
   "metadata": {},
   "source": [
    "## Train and predict ForecasterDirectMultiVariate\n",
    "\n",
    "When initializing the forecaster, the series (`level`) to be predicted and the maximum number of `steps` must be indicated since a different model will be created for each step."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3348a200",
   "metadata": {},
   "source": [
    "<div class=\"admonition note\" name=\"html-admonition\" style=\"background: rgba(0,184,212,.1); padding-top: 0px; padding-bottom: 6px; border-radius: 8px; border-left: 8px solid #00b8d4; border-color: #00b8d4; padding-left: 10px; padding-right: 10px;\">\n",
    "\n",
    "<p class=\"title\">\n",
    "    <i style=\"font-size: 18px; color:#00b8d4;\"></i>\n",
    "    <b style=\"color: #00b8d4;\">&#9998 Note</b>\n",
    "</p>\n",
    "\n",
    "<code>ForecasterDirectMultiVariate</code> includes the <code>n_jobs</code> argument, allowing <b>multi-process parallelization</b> to train estimators for all steps simultaneously, significantly reducing training time.\n",
    "\n",
    "Its effectiveness depends on factors like the estimator type, the number of model fits to perform, and the volume of data. When <code>n_jobs</code> is set to <code>'auto'</code>, the level of parallelization is automatically determined using heuristic rules designed to select the most efficient configuration for each scenario.\n",
    "\n",
    "For more information, see the guide <a href=\"../faq/parallelization-skforecast.html\">Parallelization in skforecast</a>.\n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "349d1b95-5b16-4620-a46e-d595b4187ebe",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-09-20T09:59:14.441502Z",
     "start_time": "2022-09-20T09:59:14.404629Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "    <style>\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 {\n",
       "            font-family: 'Arial', sans-serif;\n",
       "            font-size: 0.9em;\n",
       "            color: #333333;\n",
       "            border: 1px solid #ddd;\n",
       "            background-color: #f0f8ff;\n",
       "            padding: 5px 15px;\n",
       "            border-radius: 8px;\n",
       "            max-width: 600px;\n",
       "            #margin: auto;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 h2 {\n",
       "            font-size: 1.5em;\n",
       "            color: #222222;\n",
       "            border-bottom: 2px solid #ddd;\n",
       "            padding-bottom: 5px;\n",
       "            margin-bottom: 15px;\n",
       "            margin-top: 5px;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 details {\n",
       "            margin: 10px 0;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 summary {\n",
       "            font-weight: bold;\n",
       "            font-size: 1.1em;\n",
       "            color: #000000;\n",
       "            cursor: pointer;\n",
       "            margin-bottom: 5px;\n",
       "            background-color: #b3dbfd;\n",
       "            padding: 5px;\n",
       "            border-radius: 5px;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 summary:hover {\n",
       "            color: #000000;\n",
       "            background-color: #e0e0e0;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 ul {\n",
       "            font-family: 'Courier New', monospace;\n",
       "            list-style-type: none;\n",
       "            padding-left: 20px;\n",
       "            margin: 10px 0;\n",
       "            line-height: normal;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 li {\n",
       "            margin: 5px 0;\n",
       "            font-family: 'Courier New', monospace;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 li strong {\n",
       "            font-weight: bold;\n",
       "            color: #444444;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 li::before {\n",
       "            content: \"- \";\n",
       "            color: #666666;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 a {\n",
       "            color: #001633;\n",
       "            text-decoration: none;\n",
       "        }\n",
       "        .container-bf852f4b242b415da9e047c043cc6755 a:hover {\n",
       "            color: #359ccb; \n",
       "        }\n",
       "    </style>\n",
       "    \n",
       "        <div class=\"container-bf852f4b242b415da9e047c043cc6755\">\n",
       "            <p style=\"font-size: 1.5em; font-weight: bold; margin-block-start: 0.83em; margin-block-end: 0.83em;\">ForecasterDirectMultiVariate</p>\n",
       "            <details open>\n",
       "                <summary>General Information</summary>\n",
       "                <ul>\n",
       "                    <li><strong>Estimator:</strong> LGBMRegressor</li>\n",
       "                    <li><strong>Target series (level):</strong> co</li>\n",
       "                    <li><strong>Lags:</strong> [1 2 3 4 5 6 7]</li>\n",
       "                    <li><strong>Window features:</strong> ['roll_mean_7']</li>\n",
       "                    <li><strong>Window size:</strong> 7</li>\n",
       "                    <li><strong>Maximum steps to predict:</strong> 7</li>\n",
       "                    <li><strong>Exogenous included:</strong> False</li>\n",
       "                    <li><strong>Weight function included:</strong> False</li>\n",
       "                    <li><strong>Differentiation order:</strong> None</li>\n",
       "                    <li><strong>Creation date:</strong> 2025-11-26 14:54:00</li>\n",
       "                    <li><strong>Last fit date:</strong> 2025-11-26 14:54:03</li>\n",
       "                    <li><strong>Skforecast version:</strong> 0.19.0</li>\n",
       "                    <li><strong>Python version:</strong> 3.12.11</li>\n",
       "                    <li><strong>Forecaster id:</strong> None</li>\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Exogenous Variables</summary>\n",
       "                <ul>\n",
       "                    None\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Data Transformations</summary>\n",
       "                <ul>\n",
       "                    <li><strong>Transformer for series:</strong> None</li>\n",
       "                    <li><strong>Transformer for exog:</strong> None</li>\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Training Information</summary>\n",
       "                <ul>\n",
       "                    <li><strong>Target series (level):</strong> co</li>\n",
       "                    <li><strong>Multivariate series:</strong> so2, co, no, no2, pm10, nox, o3, veloc., direc., pm2.5</li>\n",
       "                    <li><strong>Training range:</strong> [Timestamp('2019-01-01 00:00:00'), Timestamp('2023-05-31 00:00:00')]</li>\n",
       "                    <li><strong>Training index type:</strong> DatetimeIndex</li>\n",
       "                    <li><strong>Training index frequency:</strong> <Day></li>\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Estimator Parameters</summary>\n",
       "                <ul>\n",
       "                    {'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': -1, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': None, 'num_leaves': 31, 'objective': None, 'random_state': 123, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'verbose': -1}\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Fit Kwargs</summary>\n",
       "                <ul>\n",
       "                    {}\n",
       "                </ul>\n",
       "            </details>\n",
       "            <p>\n",
       "                <a href=\"https://skforecast.org/0.19.0/api/forecasterdirectmultivariate.html\">&#128712 <strong>API Reference</strong></a>\n",
       "                &nbsp;&nbsp;\n",
       "                <a href=\"https://skforecast.org/0.19.0/user_guides/dependent-multi-series-multivariate-forecasting.html\">&#128462 <strong>User Guide</strong></a>\n",
       "            </p>\n",
       "        </div>\n",
       "        "
      ],
      "text/plain": [
       "============================ \n",
       "ForecasterDirectMultiVariate \n",
       "============================ \n",
       "Estimator: LGBMRegressor \n",
       "Target series (level): co \n",
       "Lags: [1 2 3 4 5 6 7] \n",
       "Window features: ['roll_mean_7'] \n",
       "Window size: 7 \n",
       "Maximum steps to predict: 7 \n",
       "Multivariate series: so2, co, no, no2, pm10, nox, o3, veloc., direc., pm2.5 \n",
       "Exogenous included: False \n",
       "Exogenous names: None \n",
       "Transformer for series: None \n",
       "Transformer for exog: None \n",
       "Weight function included: False \n",
       "Differentiation order: None \n",
       "Training range: [Timestamp('2019-01-01 00:00:00'), Timestamp('2023-05-31 00:00:00')] \n",
       "Training index type: DatetimeIndex \n",
       "Training index frequency: <Day> \n",
       "Estimator parameters: \n",
       "    {'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0,\n",
       "    'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': -1,\n",
       "    'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0,\n",
       "    'n_estimators': 100, 'n_jobs': None, 'num_leaves': 31, 'objective': None,\n",
       "    'random_state': 123, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'subsample': 1.0,\n",
       "    'subsample_for_bin': 200000, 'subsample_freq': 0, 'verbose': -1} \n",
       "fit_kwargs: {} \n",
       "Creation date: 2025-11-26 14:54:00 \n",
       "Last fit date: 2025-11-26 14:54:03 \n",
       "Skforecast version: 0.19.0 \n",
       "Python version: 3.12.11 \n",
       "Forecaster id: None "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create and fit forecaster MultiVariate\n",
    "# ==============================================================================\n",
    "forecaster = ForecasterDirectMultiVariate(\n",
    "                 estimator          = LGBMRegressor(random_state=123, verbose=-1),\n",
    "                 level              = 'co',\n",
    "                 steps              = 7,\n",
    "                 lags               = 7,\n",
    "                 window_features    = RollingFeatures(stats=['mean'], window_sizes=[7]),\n",
    "                 transformer_series = None,\n",
    "                 transformer_exog   = None\n",
    "             )\n",
    "\n",
    "forecaster.fit(series=data_train)\n",
    "forecaster"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "4b5a783f",
   "metadata": {},
   "source": [
    "When predicting, the value of `steps` must be less than or equal to the value of steps defined when initializing the forecaster. Starts at 1.\n",
    "\n",
    "+ If `int` only steps within the range of 1 to int are predicted.\n",
    "\n",
    "+ If `list` of `int`. Only the steps contained in the list are predicted.\n",
    "\n",
    "+ If `None` as many steps are predicted as were defined at initialization."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f1bdf4f8-b999-4d97-899c-fbcc2af7066a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-09-20T10:00:26.432022Z",
     "start_time": "2022-09-20T10:00:25.599841Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>level</th>\n",
       "      <th>pred</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-06-01</th>\n",
       "      <td>co</td>\n",
       "      <td>0.100165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-02</th>\n",
       "      <td>co</td>\n",
       "      <td>0.108636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-03</th>\n",
       "      <td>co</td>\n",
       "      <td>0.113710</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-04</th>\n",
       "      <td>co</td>\n",
       "      <td>0.103102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-05</th>\n",
       "      <td>co</td>\n",
       "      <td>0.105516</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-06</th>\n",
       "      <td>co</td>\n",
       "      <td>0.114029</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-07</th>\n",
       "      <td>co</td>\n",
       "      <td>0.110274</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           level      pred\n",
       "2023-06-01    co  0.100165\n",
       "2023-06-02    co  0.108636\n",
       "2023-06-03    co  0.113710\n",
       "2023-06-04    co  0.103102\n",
       "2023-06-05    co  0.105516\n",
       "2023-06-06    co  0.114029\n",
       "2023-06-07    co  0.110274"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Predict with forecaster MultiVariate\n",
    "# ==============================================================================\n",
    "predictions = forecaster.predict(steps=None)  # All steps\n",
    "predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c7b1f549",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>level</th>\n",
       "      <th>pred</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-06-01</th>\n",
       "      <td>co</td>\n",
       "      <td>0.100165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-05</th>\n",
       "      <td>co</td>\n",
       "      <td>0.105516</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           level      pred\n",
       "2023-06-01    co  0.100165\n",
       "2023-06-05    co  0.105516"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Predict only a subset of steps\n",
    "# ==============================================================================\n",
    "predictions = forecaster.predict(steps=[1, 5])\n",
    "predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e7be1699",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>level</th>\n",
       "      <th>pred</th>\n",
       "      <th>lower_bound</th>\n",
       "      <th>upper_bound</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-06-01</th>\n",
       "      <td>co</td>\n",
       "      <td>0.100165</td>\n",
       "      <td>0.096533</td>\n",
       "      <td>0.103797</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-02</th>\n",
       "      <td>co</td>\n",
       "      <td>0.108636</td>\n",
       "      <td>0.099615</td>\n",
       "      <td>0.117657</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-03</th>\n",
       "      <td>co</td>\n",
       "      <td>0.113710</td>\n",
       "      <td>0.101929</td>\n",
       "      <td>0.125490</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-04</th>\n",
       "      <td>co</td>\n",
       "      <td>0.103102</td>\n",
       "      <td>0.099967</td>\n",
       "      <td>0.106237</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-05</th>\n",
       "      <td>co</td>\n",
       "      <td>0.105516</td>\n",
       "      <td>0.099785</td>\n",
       "      <td>0.111247</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-06</th>\n",
       "      <td>co</td>\n",
       "      <td>0.114029</td>\n",
       "      <td>0.102248</td>\n",
       "      <td>0.125810</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-07</th>\n",
       "      <td>co</td>\n",
       "      <td>0.110274</td>\n",
       "      <td>0.098493</td>\n",
       "      <td>0.122054</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           level      pred  lower_bound  upper_bound\n",
       "2023-06-01    co  0.100165     0.096533     0.103797\n",
       "2023-06-02    co  0.108636     0.099615     0.117657\n",
       "2023-06-03    co  0.113710     0.101929     0.125490\n",
       "2023-06-04    co  0.103102     0.099967     0.106237\n",
       "2023-06-05    co  0.105516     0.099785     0.111247\n",
       "2023-06-06    co  0.114029     0.102248     0.125810\n",
       "2023-06-07    co  0.110274     0.098493     0.122054"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Predict intervals using in-sample residuals\n",
    "# ==============================================================================\n",
    "forecaster.set_in_sample_residuals(series=data_train)\n",
    "predictions = forecaster.predict_interval(random_state=9871)\n",
    "predictions"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45725386",
   "metadata": {},
   "source": [
    "To learn more about probabilistic forecasting features available in **skforecast**, see the [probabilistic forecasting user guides](../user_guides/probabilistic-forecasting-overview.html). "
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "bfc89fd7",
   "metadata": {},
   "source": [
    "## Backtesting MultiVariate\n",
    "\n",
    "See the [backtesting user guide](../user_guides/backtesting.html) to learn more about backtesting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b1b53f4b-be13-4e7b-bfdd-2cf0f3492452",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2022-09-20T11:01:44.610083Z",
     "start_time": "2022-09-20T11:01:44.092807Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e61164ee8a854e1e912c86f8780420f1",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/31 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>levels</th>\n",
       "      <th>mean_absolute_error</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>co</td>\n",
       "      <td>0.016993</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  levels  mean_absolute_error\n",
       "0     co             0.016993"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>level</th>\n",
       "      <th>fold</th>\n",
       "      <th>pred</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-06-01</th>\n",
       "      <td>co</td>\n",
       "      <td>0</td>\n",
       "      <td>0.100165</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-02</th>\n",
       "      <td>co</td>\n",
       "      <td>0</td>\n",
       "      <td>0.108636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-03</th>\n",
       "      <td>co</td>\n",
       "      <td>0</td>\n",
       "      <td>0.113710</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-04</th>\n",
       "      <td>co</td>\n",
       "      <td>0</td>\n",
       "      <td>0.103102</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           level  fold      pred\n",
       "2023-06-01    co     0  0.100165\n",
       "2023-06-02    co     0  0.108636\n",
       "2023-06-03    co     0  0.113710\n",
       "2023-06-04    co     0  0.103102"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Backtesting MultiVariate\n",
    "# ==============================================================================\n",
    "cv = TimeSeriesFold(\n",
    "         steps                 = 7,\n",
    "         initial_train_size    = len(data_train),\n",
    "         refit                 = False,\n",
    "         allow_incomplete_fold = True\n",
    "     )\n",
    "\n",
    "metrics_levels, backtest_preds = backtesting_forecaster_multiseries(\n",
    "                                     forecaster = forecaster,\n",
    "                                     series     = data,\n",
    "                                     cv         = cv,\n",
    "                                     metric     = 'mean_absolute_error'\n",
    "                                 )\n",
    "display(metrics_levels)\n",
    "backtest_preds.head(4)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "0d93ddc5",
   "metadata": {},
   "source": [
    "## Hyperparameter tuning and lags selection MultiVariate\n",
    "\n",
    "Hyperparameter tuning consists of systematically evaluating combinations of hyperparameters (including lags) to find the configuration that yields the best predictive performance. The **skforecast** library supports several tuning strategies: **grid search**, **random search**, and **Bayesian search**. These strategies can be used with either [backtesting](../user_guides/backtesting.html) or [one-step-ahead validation](../user_guides/hyperparameter-tuning-and-lags-selection.html#one-step-ahead-validation) to determine the optimal parameter set for a given forecasting task.\n",
    "\n",
    "The functions `grid_search_forecaster_multiseries`, `random_search_forecaster_multiseries` and `bayesian_search_forecaster_multiseries` from the `model_selection` module allow for **lags and hyperparameter optimization**.\n",
    "\n",
    "The following example shows how to use `random_search_forecaster_multiseries` to find the best lags and model hyperparameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6413fa80",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create and forecaster MultiVariate\n",
    "# ==============================================================================\n",
    "forecaster = ForecasterDirectMultiVariate(\n",
    "                 estimator       = LGBMRegressor(random_state=123, verbose=-1),\n",
    "                 level           = 'co',\n",
    "                 steps           = 7,\n",
    "                 lags            = 7,\n",
    "                 window_features = RollingFeatures(stats=['mean'], window_sizes=[7])\n",
    "             )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "8d8a8721",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "ce314ed09d02423cb5e1ccfb9c8966de",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "lags grid:   0%|          | 0/2 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "c8260d1316ce4b98b0eb4b6a5416f556",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "params grid:   0%|          | 0/5 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "`Forecaster` refitted using the best-found lags and parameters, and the whole data set: \n",
      "  Lags: [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14] \n",
      "  Parameters: {'n_estimators': np.int64(19), 'max_depth': np.int64(5)}\n",
      "  Backtesting metric: 0.016567112132881933\n",
      "  Levels: ['co']\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>levels</th>\n",
       "      <th>lags</th>\n",
       "      <th>lags_label</th>\n",
       "      <th>params</th>\n",
       "      <th>mean_absolute_error</th>\n",
       "      <th>n_estimators</th>\n",
       "      <th>max_depth</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>{'n_estimators': 19, 'max_depth': 5}</td>\n",
       "      <td>0.016567</td>\n",
       "      <td>19</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>{'n_estimators': 16, 'max_depth': 5}</td>\n",
       "      <td>0.017329</td>\n",
       "      <td>16</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'n_estimators': 18, 'max_depth': 3}</td>\n",
       "      <td>0.017705</td>\n",
       "      <td>18</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'n_estimators': 19, 'max_depth': 5}</td>\n",
       "      <td>0.017724</td>\n",
       "      <td>19</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>{'n_estimators': 18, 'max_depth': 3}</td>\n",
       "      <td>0.017854</td>\n",
       "      <td>18</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'n_estimators': 17, 'max_depth': 3}</td>\n",
       "      <td>0.017885</td>\n",
       "      <td>17</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'n_estimators': 16, 'max_depth': 5}</td>\n",
       "      <td>0.017923</td>\n",
       "      <td>16</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>{'n_estimators': 15, 'max_depth': 3}</td>\n",
       "      <td>0.018076</td>\n",
       "      <td>15</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>{'n_estimators': 17, 'max_depth': 3}</td>\n",
       "      <td>0.018101</td>\n",
       "      <td>17</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'n_estimators': 15, 'max_depth': 3}</td>\n",
       "      <td>0.018235</td>\n",
       "      <td>15</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  levels                                             lags  \\\n",
       "0   [co]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "1   [co]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "2   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "3   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "4   [co]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "5   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "6   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "7   [co]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "8   [co]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "9   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "\n",
       "                                        lags_label  \\\n",
       "0  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "1  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "2                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "3                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "4  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "5                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "6                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "7  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "8  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "9                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "\n",
       "                                 params  mean_absolute_error  n_estimators  \\\n",
       "0  {'n_estimators': 19, 'max_depth': 5}             0.016567            19   \n",
       "1  {'n_estimators': 16, 'max_depth': 5}             0.017329            16   \n",
       "2  {'n_estimators': 18, 'max_depth': 3}             0.017705            18   \n",
       "3  {'n_estimators': 19, 'max_depth': 5}             0.017724            19   \n",
       "4  {'n_estimators': 18, 'max_depth': 3}             0.017854            18   \n",
       "5  {'n_estimators': 17, 'max_depth': 3}             0.017885            17   \n",
       "6  {'n_estimators': 16, 'max_depth': 5}             0.017923            16   \n",
       "7  {'n_estimators': 15, 'max_depth': 3}             0.018076            15   \n",
       "8  {'n_estimators': 17, 'max_depth': 3}             0.018101            17   \n",
       "9  {'n_estimators': 15, 'max_depth': 3}             0.018235            15   \n",
       "\n",
       "   max_depth  \n",
       "0          5  \n",
       "1          5  \n",
       "2          3  \n",
       "3          5  \n",
       "4          3  \n",
       "5          3  \n",
       "6          5  \n",
       "7          3  \n",
       "8          3  \n",
       "9          3  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Random search MultiVariate\n",
    "# ==============================================================================\n",
    "lags_grid = [7, 14]\n",
    "param_distributions = {\n",
    "    'n_estimators': np.arange(start=10, stop=20, step=1, dtype=int),\n",
    "    'max_depth': np.arange(start=3, stop=6, step=1, dtype=int)\n",
    "}\n",
    "\n",
    "cv = TimeSeriesFold(\n",
    "         steps              = 7,\n",
    "         initial_train_size = len(data_train),\n",
    "         refit              = False,\n",
    "     )\n",
    "\n",
    "results = random_search_forecaster_multiseries(\n",
    "              forecaster          = forecaster,\n",
    "              series              = data,\n",
    "              lags_grid           = lags_grid,\n",
    "              param_distributions = param_distributions,\n",
    "              cv                  = cv,\n",
    "              metric              = 'mean_absolute_error',\n",
    "              n_iter              = 5,\n",
    "          )\n",
    "\n",
    "results"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "18bb3356",
   "metadata": {},
   "source": [
    "It is also possible to perform a bayesian optimization with **Optuna** using the `bayesian_search_forecaster_multiseries` function. For more information about this type of optimization, visit the [user guide](../user_guides/hyperparameter-tuning-and-lags-selection.html#bayesian-search)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "ac8890a5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6a06a6a21abc4069a347e616956cd814",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/5 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "`Forecaster` refitted using the best-found lags and parameters, and the whole data set: \n",
      "  Lags: [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14] \n",
      "  Parameters: {'n_estimators': 16, 'min_samples_leaf': 9, 'max_features': 'log2'}\n",
      "  Backtesting metric: 0.010437198123137972\n",
      "  Levels: ['co']\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>levels</th>\n",
       "      <th>lags</th>\n",
       "      <th>params</th>\n",
       "      <th>mean_absolute_error</th>\n",
       "      <th>n_estimators</th>\n",
       "      <th>min_samples_leaf</th>\n",
       "      <th>max_features</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>{'n_estimators': 16, 'min_samples_leaf': 9, 'm...</td>\n",
       "      <td>0.010437</td>\n",
       "      <td>16</td>\n",
       "      <td>9</td>\n",
       "      <td>log2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'n_estimators': 15, 'min_samples_leaf': 4, 'm...</td>\n",
       "      <td>0.010891</td>\n",
       "      <td>15</td>\n",
       "      <td>4</td>\n",
       "      <td>sqrt</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'n_estimators': 14, 'min_samples_leaf': 8, 'm...</td>\n",
       "      <td>0.011436</td>\n",
       "      <td>14</td>\n",
       "      <td>8</td>\n",
       "      <td>log2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'n_estimators': 12, 'min_samples_leaf': 6, 'm...</td>\n",
       "      <td>0.012376</td>\n",
       "      <td>12</td>\n",
       "      <td>6</td>\n",
       "      <td>log2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  levels                                             lags  \\\n",
       "0   [co]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "1   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "2   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "3   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "\n",
       "                                              params  mean_absolute_error  \\\n",
       "0  {'n_estimators': 16, 'min_samples_leaf': 9, 'm...             0.010437   \n",
       "1  {'n_estimators': 15, 'min_samples_leaf': 4, 'm...             0.010891   \n",
       "2  {'n_estimators': 14, 'min_samples_leaf': 8, 'm...             0.011436   \n",
       "3  {'n_estimators': 12, 'min_samples_leaf': 6, 'm...             0.012376   \n",
       "\n",
       "   n_estimators  min_samples_leaf max_features  \n",
       "0            16                 9         log2  \n",
       "1            15                 4         sqrt  \n",
       "2            14                 8         log2  \n",
       "3            12                 6         log2  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Bayesian search hyperparameters and lags with Optuna\n",
    "# ==============================================================================\n",
    "forecaster = ForecasterDirectMultiVariate(\n",
    "                 estimator       = LGBMRegressor(random_state=123, verbose=-1),\n",
    "                 level           = 'co',\n",
    "                 steps           = 7,\n",
    "                 lags            = 7,\n",
    "                 window_features = RollingFeatures(stats=['mean'], window_sizes=[7])\n",
    "             )\n",
    "\n",
    "# Search space\n",
    "def search_space(trial):\n",
    "    search_space  = {\n",
    "        'lags'            : trial.suggest_categorical('lags', [7, 14]),\n",
    "        'n_estimators'    : trial.suggest_int('n_estimators', 10, 20),\n",
    "        'min_samples_leaf': trial.suggest_int('min_samples_leaf', 1., 10),\n",
    "        'max_features'    : trial.suggest_categorical('max_features', ['log2', 'sqrt'])\n",
    "    }\n",
    "\n",
    "    return search_space\n",
    "\n",
    "cv = OneStepAheadFold(initial_train_size = '2023-05-31 23:59:59')\n",
    "\n",
    "results, best_trial = bayesian_search_forecaster_multiseries(\n",
    "                          forecaster            = forecaster,\n",
    "                          series                = data,\n",
    "                          search_space          = search_space,\n",
    "                          cv                    = cv,\n",
    "                          metric                = 'mean_absolute_error',\n",
    "                          n_trials              = 5,\n",
    "                          kwargs_create_study   = {},\n",
    "                          kwargs_study_optimize = {}\n",
    "                      )\n",
    "\n",
    "results.head(4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d7717df3",
   "metadata": {},
   "source": [
    "The `best_trial` return contains the details of the trial that achieved the best result during optimization. For more information, refer to the [Study class](https://optuna.readthedocs.io/en/stable/reference/generated/optuna.study.Study.html#optuna.study.Study)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "e5a6c544",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "FrozenTrial(number=3, state=1, values=[0.010437198123137972], datetime_start=datetime.datetime(2025, 11, 26, 14, 54, 12, 391445), datetime_complete=datetime.datetime(2025, 11, 26, 14, 54, 12, 499538), params={'lags': 14, 'n_estimators': 16, 'min_samples_leaf': 9, 'max_features': 'log2'}, user_attrs={}, system_attrs={}, intermediate_values={}, distributions={'lags': CategoricalDistribution(choices=(7, 14)), 'n_estimators': IntDistribution(high=20, log=False, low=10, step=1), 'min_samples_leaf': IntDistribution(high=10, log=False, low=1, step=1), 'max_features': CategoricalDistribution(choices=('log2', 'sqrt'))}, trial_id=3, value=None)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Optuna best trial in the study\n",
    "# ==============================================================================\n",
    "best_trial"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "f48b1b2f",
   "metadata": {},
   "source": [
    "## Different lags for each time series\n",
    "\n",
    "Passing a `dict` to the `lags` argument allows specifying different lags for each time series. The dictionary keys must correspond to the names of the series used during training, and the values define the lags to be applied to each one individually."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "1804117c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>level</th>\n",
       "      <th>pred</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-06-01</th>\n",
       "      <td>co</td>\n",
       "      <td>0.098798</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-02</th>\n",
       "      <td>co</td>\n",
       "      <td>0.107185</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-03</th>\n",
       "      <td>co</td>\n",
       "      <td>0.112225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-04</th>\n",
       "      <td>co</td>\n",
       "      <td>0.107208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-05</th>\n",
       "      <td>co</td>\n",
       "      <td>0.098643</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-06</th>\n",
       "      <td>co</td>\n",
       "      <td>0.100375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-07</th>\n",
       "      <td>co</td>\n",
       "      <td>0.099513</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           level      pred\n",
       "2023-06-01    co  0.098798\n",
       "2023-06-02    co  0.107185\n",
       "2023-06-03    co  0.112225\n",
       "2023-06-04    co  0.107208\n",
       "2023-06-05    co  0.098643\n",
       "2023-06-06    co  0.100375\n",
       "2023-06-07    co  0.099513"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create and fit forecaster MultiVariate Custom lags\n",
    "# ==============================================================================\n",
    "lags_dict = {\n",
    "    'so2': [7, 14], 'co': 7, 'no': [7, 14], 'no2': [7, 14],\n",
    "    'pm10': [7, 14], 'nox': [7, 14], 'o3': [7, 14], 'veloc.': 3,\n",
    "    'direc.': 3, 'pm2.5': [7, 14]\n",
    "}\n",
    "forecaster = ForecasterDirectMultiVariate(\n",
    "                 estimator = LGBMRegressor(random_state=123, verbose=-1),\n",
    "                 level     = 'co',\n",
    "                 steps     = 7,\n",
    "                 lags      = lags_dict,\n",
    "             )\n",
    "\n",
    "forecaster.fit(series=data_train)\n",
    "\n",
    "# Predict\n",
    "# ==============================================================================\n",
    "predictions = forecaster.predict(steps=7)\n",
    "predictions"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fbe427dc",
   "metadata": {},
   "source": [
    "If `None` is assigned to any key in the `lags` dictionary, that series will be excluded from the creation of the `X` training matrix.\n",
    "\n",
    "In the following example, no lags are generated for the `'co'` series. However, since `'co'` is the specified target `level`, its values are still used to construct the `y` training matrix."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3a9148bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>level</th>\n",
       "      <th>pred</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-06-01</th>\n",
       "      <td>co</td>\n",
       "      <td>0.107966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-02</th>\n",
       "      <td>co</td>\n",
       "      <td>0.118692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-03</th>\n",
       "      <td>co</td>\n",
       "      <td>0.125480</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-04</th>\n",
       "      <td>co</td>\n",
       "      <td>0.132908</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-05</th>\n",
       "      <td>co</td>\n",
       "      <td>0.118237</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-06</th>\n",
       "      <td>co</td>\n",
       "      <td>0.121638</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-07</th>\n",
       "      <td>co</td>\n",
       "      <td>0.120753</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           level      pred\n",
       "2023-06-01    co  0.107966\n",
       "2023-06-02    co  0.118692\n",
       "2023-06-03    co  0.125480\n",
       "2023-06-04    co  0.132908\n",
       "2023-06-05    co  0.118237\n",
       "2023-06-06    co  0.121638\n",
       "2023-06-07    co  0.120753"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create and fit forecaster MultiVariate Custom lags with None\n",
    "# ==============================================================================\n",
    "lags_dict = {\n",
    "    'so2': [7, 14], 'co': None, 'no': [7, 14], 'no2': [7, 14],\n",
    "    'pm10': [7, 14], 'nox': [7, 14], 'o3': [7, 14], 'veloc.': 3,\n",
    "    'direc.': 3, 'pm2.5': [7, 14]\n",
    "}\n",
    "forecaster = ForecasterDirectMultiVariate(\n",
    "                 estimator = LGBMRegressor(random_state=123, verbose=-1),\n",
    "                 level     = 'co',\n",
    "                 lags      = lags_dict,\n",
    "                 steps     = 7,\n",
    "             )\n",
    "\n",
    "forecaster.fit(series=data_train)\n",
    "\n",
    "# Predict\n",
    "# ==============================================================================\n",
    "predictions = forecaster.predict(steps=7)\n",
    "predictions"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "88e7af89",
   "metadata": {},
   "source": [
    "It is possible to use the `create_train_X_y` method to generate the matrices that the forecaster is using to train the model. This approach enables gaining insight into the specific lags that have been created."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "87227039",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>so2_lag_7</th>\n",
       "      <th>so2_lag_14</th>\n",
       "      <th>no_lag_7</th>\n",
       "      <th>no_lag_14</th>\n",
       "      <th>no2_lag_7</th>\n",
       "      <th>no2_lag_14</th>\n",
       "      <th>pm10_lag_7</th>\n",
       "      <th>pm10_lag_14</th>\n",
       "      <th>nox_lag_7</th>\n",
       "      <th>nox_lag_14</th>\n",
       "      <th>o3_lag_7</th>\n",
       "      <th>o3_lag_14</th>\n",
       "      <th>veloc._lag_1</th>\n",
       "      <th>veloc._lag_2</th>\n",
       "      <th>veloc._lag_3</th>\n",
       "      <th>direc._lag_1</th>\n",
       "      <th>direc._lag_2</th>\n",
       "      <th>direc._lag_3</th>\n",
       "      <th>pm2.5_lag_7</th>\n",
       "      <th>pm2.5_lag_14</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>datetime</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-15</th>\n",
       "      <td>1.061795</td>\n",
       "      <td>2.362414</td>\n",
       "      <td>3.462136</td>\n",
       "      <td>2.232968</td>\n",
       "      <td>2.971237</td>\n",
       "      <td>2.098158</td>\n",
       "      <td>1.175259</td>\n",
       "      <td>0.229121</td>\n",
       "      <td>3.419881</td>\n",
       "      <td>2.298657</td>\n",
       "      <td>-1.871669</td>\n",
       "      <td>-1.800847</td>\n",
       "      <td>-0.726869</td>\n",
       "      <td>-0.979544</td>\n",
       "      <td>-0.792953</td>\n",
       "      <td>0.673274</td>\n",
       "      <td>1.019948</td>\n",
       "      <td>1.581166</td>\n",
       "      <td>2.104497</td>\n",
       "      <td>1.084751</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-16</th>\n",
       "      <td>1.805006</td>\n",
       "      <td>2.408865</td>\n",
       "      <td>6.247303</td>\n",
       "      <td>3.270300</td>\n",
       "      <td>2.622404</td>\n",
       "      <td>3.254290</td>\n",
       "      <td>1.156585</td>\n",
       "      <td>0.599485</td>\n",
       "      <td>4.605306</td>\n",
       "      <td>3.486375</td>\n",
       "      <td>-1.754371</td>\n",
       "      <td>-2.256761</td>\n",
       "      <td>-1.150585</td>\n",
       "      <td>-0.726869</td>\n",
       "      <td>-0.979544</td>\n",
       "      <td>0.171311</td>\n",
       "      <td>0.673274</td>\n",
       "      <td>1.019948</td>\n",
       "      <td>1.782163</td>\n",
       "      <td>1.108193</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-17</th>\n",
       "      <td>-0.982034</td>\n",
       "      <td>2.269513</td>\n",
       "      <td>0.826174</td>\n",
       "      <td>6.311248</td>\n",
       "      <td>2.596491</td>\n",
       "      <td>3.629037</td>\n",
       "      <td>-0.119456</td>\n",
       "      <td>1.327762</td>\n",
       "      <td>1.927209</td>\n",
       "      <td>5.208336</td>\n",
       "      <td>-0.331300</td>\n",
       "      <td>-2.356354</td>\n",
       "      <td>-0.944558</td>\n",
       "      <td>-1.150585</td>\n",
       "      <td>-0.726869</td>\n",
       "      <td>0.511174</td>\n",
       "      <td>0.171311</td>\n",
       "      <td>0.673274</td>\n",
       "      <td>-0.374541</td>\n",
       "      <td>1.705975</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-01-18</th>\n",
       "      <td>1.479852</td>\n",
       "      <td>1.758556</td>\n",
       "      <td>8.194077</td>\n",
       "      <td>2.886629</td>\n",
       "      <td>4.617729</td>\n",
       "      <td>2.911437</td>\n",
       "      <td>1.221944</td>\n",
       "      <td>1.032094</td>\n",
       "      <td>6.726230</td>\n",
       "      <td>3.096583</td>\n",
       "      <td>-1.433461</td>\n",
       "      <td>-2.073068</td>\n",
       "      <td>-1.115600</td>\n",
       "      <td>-0.944558</td>\n",
       "      <td>-1.150585</td>\n",
       "      <td>1.436094</td>\n",
       "      <td>0.511174</td>\n",
       "      <td>0.171311</td>\n",
       "      <td>0.815163</td>\n",
       "      <td>1.782163</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            so2_lag_7  so2_lag_14  no_lag_7  no_lag_14  no2_lag_7  no2_lag_14  \\\n",
       "datetime                                                                        \n",
       "2019-01-15   1.061795    2.362414  3.462136   2.232968   2.971237    2.098158   \n",
       "2019-01-16   1.805006    2.408865  6.247303   3.270300   2.622404    3.254290   \n",
       "2019-01-17  -0.982034    2.269513  0.826174   6.311248   2.596491    3.629037   \n",
       "2019-01-18   1.479852    1.758556  8.194077   2.886629   4.617729    2.911437   \n",
       "\n",
       "            pm10_lag_7  pm10_lag_14  nox_lag_7  nox_lag_14  o3_lag_7  \\\n",
       "datetime                                                               \n",
       "2019-01-15    1.175259     0.229121   3.419881    2.298657 -1.871669   \n",
       "2019-01-16    1.156585     0.599485   4.605306    3.486375 -1.754371   \n",
       "2019-01-17   -0.119456     1.327762   1.927209    5.208336 -0.331300   \n",
       "2019-01-18    1.221944     1.032094   6.726230    3.096583 -1.433461   \n",
       "\n",
       "            o3_lag_14  veloc._lag_1  veloc._lag_2  veloc._lag_3  direc._lag_1  \\\n",
       "datetime                                                                        \n",
       "2019-01-15  -1.800847     -0.726869     -0.979544     -0.792953      0.673274   \n",
       "2019-01-16  -2.256761     -1.150585     -0.726869     -0.979544      0.171311   \n",
       "2019-01-17  -2.356354     -0.944558     -1.150585     -0.726869      0.511174   \n",
       "2019-01-18  -2.073068     -1.115600     -0.944558     -1.150585      1.436094   \n",
       "\n",
       "            direc._lag_2  direc._lag_3  pm2.5_lag_7  pm2.5_lag_14  \n",
       "datetime                                                           \n",
       "2019-01-15      1.019948      1.581166     2.104497      1.084751  \n",
       "2019-01-16      0.673274      1.019948     1.782163      1.108193  \n",
       "2019-01-17      0.171311      0.673274    -0.374541      1.705975  \n",
       "2019-01-18      0.511174      0.171311     0.815163      1.782163  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Extract training matrix\n",
    "# ==============================================================================\n",
    "X_train, y_train = forecaster.create_train_X_y(series=data_train)\n",
    "\n",
    "# X and y to train model for step 1\n",
    "X_train_step_1, y_train_step_1 = forecaster.filter_train_X_y_for_step(\n",
    "                                     step    = 1,\n",
    "                                     X_train = X_train,\n",
    "                                     y_train = y_train,\n",
    "                                 )\n",
    "\n",
    "X_train_step_1.head(4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "9ba74cbb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "datetime\n",
       "2019-01-15    3.149604\n",
       "2019-01-16    1.554001\n",
       "2019-01-17   -0.323179\n",
       "2019-01-18   -0.417038\n",
       "Freq: D, Name: co_step_1, dtype: float64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Extract training matrix\n",
    "# ==============================================================================\n",
    "y_train_step_1.head(4)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8086660d",
   "metadata": {},
   "source": [
    "## Exogenous variables in MultiVariate\n",
    "\n",
    "Exogenous variables are predictors that are independent of the model being used for forecasting, and their future values must be known in order to include them in the prediction process.\n",
    "\n",
    "In the <code>ForecasterDirectMultiVariate</code>, as in the other forecasters, exogenous variables can be easily included as predictors using the `exog` argument.\n",
    "\n",
    "To learn more about exogenous variables in skforecast visit the [exogenous variables user guide](../user_guides/exogenous-variables.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61fb611e",
   "metadata": {},
   "source": [
    "## Scikit-learn transformers in MultiVariate\n",
    "\n",
    "By default, the <code>ForecasterDirectMultiVariate</code> class uses the scikit-learn `StandardScaler` transformer to scale the data. This transformer is applied to all series. However, it is possible to use different transformers for each series or not to apply any transformation at all:\n",
    "\n",
    "+ If `transformer_series` is a `transformer` the same transformation will be applied to all series. \n",
    "\n",
    "+ If `transformer_series` is a `dict` a different transformation can be set for each series. Series not present in the dict will not have any transformation applied to them (check warning message).\n",
    "\n",
    "Learn more about [using scikit-learn transformers](../user_guides/sklearn-transformers-and-pipeline.html) with skforecast."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "6de758bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "    <style>\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce {\n",
       "            font-family: 'Arial', sans-serif;\n",
       "            font-size: 0.9em;\n",
       "            color: #333333;\n",
       "            border: 1px solid #ddd;\n",
       "            background-color: #f0f8ff;\n",
       "            padding: 5px 15px;\n",
       "            border-radius: 8px;\n",
       "            max-width: 600px;\n",
       "            #margin: auto;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce h2 {\n",
       "            font-size: 1.5em;\n",
       "            color: #222222;\n",
       "            border-bottom: 2px solid #ddd;\n",
       "            padding-bottom: 5px;\n",
       "            margin-bottom: 15px;\n",
       "            margin-top: 5px;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce details {\n",
       "            margin: 10px 0;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce summary {\n",
       "            font-weight: bold;\n",
       "            font-size: 1.1em;\n",
       "            color: #000000;\n",
       "            cursor: pointer;\n",
       "            margin-bottom: 5px;\n",
       "            background-color: #b3dbfd;\n",
       "            padding: 5px;\n",
       "            border-radius: 5px;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce summary:hover {\n",
       "            color: #000000;\n",
       "            background-color: #e0e0e0;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce ul {\n",
       "            font-family: 'Courier New', monospace;\n",
       "            list-style-type: none;\n",
       "            padding-left: 20px;\n",
       "            margin: 10px 0;\n",
       "            line-height: normal;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce li {\n",
       "            margin: 5px 0;\n",
       "            font-family: 'Courier New', monospace;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce li strong {\n",
       "            font-weight: bold;\n",
       "            color: #444444;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce li::before {\n",
       "            content: \"- \";\n",
       "            color: #666666;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce a {\n",
       "            color: #001633;\n",
       "            text-decoration: none;\n",
       "        }\n",
       "        .container-3510b89fa3a14d7284c543247325a5ce a:hover {\n",
       "            color: #359ccb; \n",
       "        }\n",
       "    </style>\n",
       "    \n",
       "        <div class=\"container-3510b89fa3a14d7284c543247325a5ce\">\n",
       "            <p style=\"font-size: 1.5em; font-weight: bold; margin-block-start: 0.83em; margin-block-end: 0.83em;\">ForecasterDirectMultiVariate</p>\n",
       "            <details open>\n",
       "                <summary>General Information</summary>\n",
       "                <ul>\n",
       "                    <li><strong>Estimator:</strong> LGBMRegressor</li>\n",
       "                    <li><strong>Target series (level):</strong> co</li>\n",
       "                    <li><strong>Lags:</strong> [1 2 3 4 5 6 7]</li>\n",
       "                    <li><strong>Window features:</strong> None</li>\n",
       "                    <li><strong>Window size:</strong> 7</li>\n",
       "                    <li><strong>Maximum steps to predict:</strong> 7</li>\n",
       "                    <li><strong>Exogenous included:</strong> False</li>\n",
       "                    <li><strong>Weight function included:</strong> False</li>\n",
       "                    <li><strong>Differentiation order:</strong> None</li>\n",
       "                    <li><strong>Creation date:</strong> 2025-11-26 14:54:14</li>\n",
       "                    <li><strong>Last fit date:</strong> 2025-11-26 14:54:15</li>\n",
       "                    <li><strong>Skforecast version:</strong> 0.19.0</li>\n",
       "                    <li><strong>Python version:</strong> 3.12.11</li>\n",
       "                    <li><strong>Forecaster id:</strong> None</li>\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Exogenous Variables</summary>\n",
       "                <ul>\n",
       "                    None\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Data Transformations</summary>\n",
       "                <ul>\n",
       "                    <li><strong>Transformer for series:</strong> 'co': StandardScaler(), 'no2': StandardScaler()</li>\n",
       "                    <li><strong>Transformer for exog:</strong> None</li>\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Training Information</summary>\n",
       "                <ul>\n",
       "                    <li><strong>Target series (level):</strong> co</li>\n",
       "                    <li><strong>Multivariate series:</strong> so2, co, no, no2, pm10, nox, o3, veloc., direc., pm2.5</li>\n",
       "                    <li><strong>Training range:</strong> [Timestamp('2019-01-01 00:00:00'), Timestamp('2023-05-31 00:00:00')]</li>\n",
       "                    <li><strong>Training index type:</strong> DatetimeIndex</li>\n",
       "                    <li><strong>Training index frequency:</strong> <Day></li>\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Estimator Parameters</summary>\n",
       "                <ul>\n",
       "                    {'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0, 'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': -1, 'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_estimators': 100, 'n_jobs': None, 'num_leaves': 31, 'objective': None, 'random_state': 123, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'subsample': 1.0, 'subsample_for_bin': 200000, 'subsample_freq': 0, 'verbose': -1}\n",
       "                </ul>\n",
       "            </details>\n",
       "            <details>\n",
       "                <summary>Fit Kwargs</summary>\n",
       "                <ul>\n",
       "                    {}\n",
       "                </ul>\n",
       "            </details>\n",
       "            <p>\n",
       "                <a href=\"https://skforecast.org/0.19.0/api/forecasterdirectmultivariate.html\">&#128712 <strong>API Reference</strong></a>\n",
       "                &nbsp;&nbsp;\n",
       "                <a href=\"https://skforecast.org/0.19.0/user_guides/dependent-multi-series-multivariate-forecasting.html\">&#128462 <strong>User Guide</strong></a>\n",
       "            </p>\n",
       "        </div>\n",
       "        "
      ],
      "text/plain": [
       "============================ \n",
       "ForecasterDirectMultiVariate \n",
       "============================ \n",
       "Estimator: LGBMRegressor \n",
       "Target series (level): co \n",
       "Lags: [1 2 3 4 5 6 7] \n",
       "Window features: None \n",
       "Window size: 7 \n",
       "Maximum steps to predict: 7 \n",
       "Multivariate series: so2, co, no, no2, pm10, nox, o3, veloc., direc., pm2.5 \n",
       "Exogenous included: False \n",
       "Exogenous names: None \n",
       "Transformer for series: 'co': StandardScaler(), 'no2': StandardScaler() \n",
       "Transformer for exog: None \n",
       "Weight function included: False \n",
       "Differentiation order: None \n",
       "Training range: [Timestamp('2019-01-01 00:00:00'), Timestamp('2023-05-31 00:00:00')] \n",
       "Training index type: DatetimeIndex \n",
       "Training index frequency: <Day> \n",
       "Estimator parameters: \n",
       "    {'boosting_type': 'gbdt', 'class_weight': None, 'colsample_bytree': 1.0,\n",
       "    'importance_type': 'split', 'learning_rate': 0.1, 'max_depth': -1,\n",
       "    'min_child_samples': 20, 'min_child_weight': 0.001, 'min_split_gain': 0.0,\n",
       "    'n_estimators': 100, 'n_jobs': None, 'num_leaves': 31, 'objective': None,\n",
       "    'random_state': 123, 'reg_alpha': 0.0, 'reg_lambda': 0.0, 'subsample': 1.0,\n",
       "    'subsample_for_bin': 200000, 'subsample_freq': 0, 'verbose': -1} \n",
       "fit_kwargs: {} \n",
       "Creation date: 2025-11-26 14:54:14 \n",
       "Last fit date: 2025-11-26 14:54:15 \n",
       "Skforecast version: 0.19.0 \n",
       "Python version: 3.12.11 \n",
       "Forecaster id: None "
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Transformers in MultiVariate\n",
    "# ==============================================================================\n",
    "forecaster = ForecasterDirectMultiVariate(\n",
    "                 estimator          = LGBMRegressor(random_state=123, verbose=-1),\n",
    "                 level              = 'co',\n",
    "                 lags               = 7,\n",
    "                 steps              = 7,\n",
    "                 transformer_series = {'co': StandardScaler(), 'no2': StandardScaler()}\n",
    "             )\n",
    "\n",
    "forecaster.fit(series=data_train)\n",
    "forecaster"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "6ef846b0",
   "metadata": {},
   "source": [
    "## Weights in MultiVariate\n",
    "\n",
    "The weights are used to control the influence that each observation has on the training of the model.\n",
    "\n",
    "Learn more about [weighted time series forecasting](../user_guides/weighted-time-series-forecasting.html) with skforecast."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "d4966617",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>level</th>\n",
       "      <th>pred</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-06-01</th>\n",
       "      <td>co</td>\n",
       "      <td>0.106243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-02</th>\n",
       "      <td>co</td>\n",
       "      <td>0.103617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-06-03</th>\n",
       "      <td>co</td>\n",
       "      <td>0.102537</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           level      pred\n",
       "2023-06-01    co  0.106243\n",
       "2023-06-02    co  0.103617\n",
       "2023-06-03    co  0.102537"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Weights in MultiVariate\n",
    "# ==============================================================================\n",
    "def custom_weights(index):\n",
    "    \"\"\"\n",
    "    Return 0 if index is between '2013-01-01' and '2013-01-31', 1 otherwise.\n",
    "    \"\"\"\n",
    "    weights = np.where(\n",
    "                  (index >= '2013-01-01') & (index <= '2013-01-31'),\n",
    "                   0,\n",
    "                   1\n",
    "              )\n",
    "    \n",
    "    return weights\n",
    "\n",
    "\n",
    "forecaster = ForecasterDirectMultiVariate(\n",
    "                 estimator          = LGBMRegressor(random_state=123, verbose=-1),\n",
    "                 level              = 'co',\n",
    "                 lags               = 7,\n",
    "                 steps              = 7,\n",
    "                 transformer_series = StandardScaler(),\n",
    "                 weight_func        = custom_weights\n",
    "             )\n",
    "\n",
    "forecaster.fit(series=data_train)\n",
    "forecaster.predict(steps=7).head(3)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "9f7180da",
   "metadata": {},
   "source": [
    "<div class=\"admonition note\" name=\"html-admonition\" style=\"background: rgba(255,145,0,.1); padding-top: 0px; padding-bottom: 6px; border-radius: 8px; border-left: 8px solid #ff9100; border-color: #ff9100; padding-left: 10px; padding-right: 10px\">\n",
    "\n",
    "<p class=\"title\">\n",
    "    <i style=\"font-size: 18px; color:#ff9100; border-color: #ff1744;\"></i>\n",
    "    <b style=\"color: #ff9100;\"> <span style=\"color: #ff9100;\">&#9888;</span> Warning</b>\n",
    "</p>\n",
    "\n",
    "The <code>weight_func</code> argument will be ignored if the estimator does not accept <code>sample_weight</code> in its <code>fit</code> method.\n",
    "\n",
    "</div>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "3c410247",
   "metadata": {},
   "source": [
    "The source code of the `weight_func` added to the forecaster is stored in the argument `source_code_weight_func`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "fbe3c2a9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "def custom_weights(index):\n",
      "    \"\"\"\n",
      "    Return 0 if index is between '2013-01-01' and '2013-01-31', 1 otherwise.\n",
      "    \"\"\"\n",
      "    weights = np.where(\n",
      "                  (index >= '2013-01-01') & (index <= '2013-01-31'),\n",
      "                   0,\n",
      "                   1\n",
      "              )\n",
      "\n",
      "    return weights\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Source code weight function\n",
    "# ==============================================================================\n",
    "print(forecaster.source_code_weight_func)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "31b0c86d",
   "metadata": {},
   "source": [
    "## Compare multiple metrics\n",
    "\n",
    "The functions `backtesting_forecaster_multiseries`, `grid_search_forecaster_multiseries`, `random_search_forecaster_multiseries`, and `bayesian_search_forecaster_multiseries` support the evaluation of **multiple metrics** by passing a `list` of metric functions. This list can include both built-in metrics (e.g. `mean_squared_error`, `mean_absolute_error`) and custom-defined ones.\n",
    "\n",
    "When multiple metrics are provided, the **first metric in the list** is used to select the best model."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "350793bb",
   "metadata": {},
   "source": [
    "<div class=\"admonition note\" name=\"html-admonition\" style=\"background: rgba(0,191,191,.1); padding-top: 0px; padding-bottom: 6px; border-radius: 8px; border-left: 8px solid #00bfa5; border-color: #00bfa5; padding-left: 10px; padding-right: 10px;\">\n",
    "\n",
    "<p class=\"title\">\n",
    "    <i style=\"font-size: 18px; color:#00bfa5;\"></i>\n",
    "    <b style=\"color: #00bfa5;\">&#128161 Tip</b>\n",
    "</p>\n",
    "\n",
    "More information about <b>time series forecasting metrics</b> can be found in the <a href=\"../user_guides/metrics.html\">Metrics</a> guide.\n",
    "\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "9b5c77b3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "04bb391c7d27484ca4e98dcb84b8ca8c",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "lags grid:   0%|          | 0/2 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6303e9190b3e48cbb32643cd7455e28d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "params grid:   0%|          | 0/3 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "`Forecaster` refitted using the best-found lags and parameters, and the whole data set: \n",
      "  Lags: [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14] \n",
      "  Parameters: {'alpha': 0.01}\n",
      "  Backtesting metric: 0.014486558378954958\n",
      "  Levels: ['co']\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>levels</th>\n",
       "      <th>lags</th>\n",
       "      <th>lags_label</th>\n",
       "      <th>params</th>\n",
       "      <th>mean_absolute_error</th>\n",
       "      <th>custom_metric</th>\n",
       "      <th>mean_squared_error</th>\n",
       "      <th>alpha</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>{'alpha': 0.01}</td>\n",
       "      <td>0.014487</td>\n",
       "      <td>0.021981</td>\n",
       "      <td>0.000439</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>{'alpha': 0.1}</td>\n",
       "      <td>0.014487</td>\n",
       "      <td>0.021981</td>\n",
       "      <td>0.000439</td>\n",
       "      <td>0.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]</td>\n",
       "      <td>{'alpha': 1}</td>\n",
       "      <td>0.014487</td>\n",
       "      <td>0.021981</td>\n",
       "      <td>0.000439</td>\n",
       "      <td>1.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'alpha': 0.01}</td>\n",
       "      <td>0.014773</td>\n",
       "      <td>0.022789</td>\n",
       "      <td>0.000511</td>\n",
       "      <td>0.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'alpha': 1}</td>\n",
       "      <td>0.014773</td>\n",
       "      <td>0.022789</td>\n",
       "      <td>0.000511</td>\n",
       "      <td>1.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>[co]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>[1, 2, 3, 4, 5, 6, 7]</td>\n",
       "      <td>{'alpha': 0.1}</td>\n",
       "      <td>0.014773</td>\n",
       "      <td>0.022789</td>\n",
       "      <td>0.000511</td>\n",
       "      <td>0.10</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  levels                                             lags  \\\n",
       "0   [co]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "1   [co]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "2   [co]  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   \n",
       "3   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "4   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "5   [co]                            [1, 2, 3, 4, 5, 6, 7]   \n",
       "\n",
       "                                        lags_label           params  \\\n",
       "0  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]  {'alpha': 0.01}   \n",
       "1  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]   {'alpha': 0.1}   \n",
       "2  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]     {'alpha': 1}   \n",
       "3                            [1, 2, 3, 4, 5, 6, 7]  {'alpha': 0.01}   \n",
       "4                            [1, 2, 3, 4, 5, 6, 7]     {'alpha': 1}   \n",
       "5                            [1, 2, 3, 4, 5, 6, 7]   {'alpha': 0.1}   \n",
       "\n",
       "   mean_absolute_error  custom_metric  mean_squared_error  alpha  \n",
       "0             0.014487       0.021981            0.000439   0.01  \n",
       "1             0.014487       0.021981            0.000439   0.10  \n",
       "2             0.014487       0.021981            0.000439   1.00  \n",
       "3             0.014773       0.022789            0.000511   0.01  \n",
       "4             0.014773       0.022789            0.000511   1.00  \n",
       "5             0.014773       0.022789            0.000511   0.10  "
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Grid search MultiVariate with multiple metrics\n",
    "# ==============================================================================\n",
    "forecaster = ForecasterDirectMultiVariate(\n",
    "                 estimator = LGBMRegressor(random_state=123, verbose=-1),\n",
    "                 level     = 'co',\n",
    "                 lags      = 7,\n",
    "                 steps     = 7\n",
    "             )    \n",
    "\n",
    "def custom_metric(y_true, y_pred):\n",
    "    \"\"\"\n",
    "    Calculate the mean absolute error using only the predicted values of the last\n",
    "    3 months of the year.\n",
    "    \"\"\"\n",
    "    mask = y_true.index.month.isin([10, 11, 12])\n",
    "    metric = mean_absolute_error(y_true[mask], y_pred[mask])\n",
    "    \n",
    "    return metric\n",
    "\n",
    "cv = TimeSeriesFold(\n",
    "         steps              = 7,\n",
    "         initial_train_size = len(data_train),\n",
    "         refit              = False,\n",
    "     )\n",
    "\n",
    "lags_grid = [7, 14]\n",
    "param_grid = {'alpha': [0.01, 0.1, 1]}\n",
    "\n",
    "results = grid_search_forecaster_multiseries(\n",
    "              forecaster = forecaster,\n",
    "              series     = data,\n",
    "              lags_grid  = lags_grid,\n",
    "              param_grid = param_grid,\n",
    "              cv         = cv,\n",
    "              metric     = [mean_absolute_error, custom_metric, 'mean_squared_error']\n",
    "          )\n",
    "\n",
    "results"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "dbe3c4dc-4b71-42f0-a4c9-d6815535272d",
   "metadata": {},
   "source": [
    "## Feature importances\n",
    "\n",
    "Since <code>ForecasterDirectMultiVariate</code> fits one model per step, it is necessary to specify from which model retrieves its feature importances."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "8394cca9-e86d-4309-b10c-ea26485f85e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>co_lag_1</td>\n",
       "      <td>146</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>no_lag_4</td>\n",
       "      <td>84</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>pm10_lag_6</td>\n",
       "      <td>64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>so2_lag_2</td>\n",
       "      <td>52</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>so2_lag_1</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>no2_lag_11</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>131</th>\n",
       "      <td>pm2.5_lag_6</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>132</th>\n",
       "      <td>pm2.5_lag_7</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>82</th>\n",
       "      <td>nox_lag_13</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>no2_lag_13</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>140 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         feature  importance\n",
       "14      co_lag_1         146\n",
       "31      no_lag_4          84\n",
       "61    pm10_lag_6          64\n",
       "1      so2_lag_2          52\n",
       "0      so2_lag_1          50\n",
       "..           ...         ...\n",
       "52    no2_lag_11           8\n",
       "131  pm2.5_lag_6           8\n",
       "132  pm2.5_lag_7           7\n",
       "82    nox_lag_13           5\n",
       "54    no2_lag_13           3\n",
       "\n",
       "[140 rows x 2 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Feature importances for step 1\n",
    "# ==============================================================================\n",
    "forecaster.get_feature_importances(step=1)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "6d257fbe-f14e-4b5c-b21c-82b1fa87d511",
   "metadata": {},
   "source": [
    "## Training and prediction matrices\n",
    "\n",
    "While the primary goal of building forecasting models is to predict future values, it is equally important to evaluate if the model is effectively learning from the training data. Analyzing predictions on the training data or exploring the prediction matrices is crucial for assessing model performance and understanding areas for optimization. This process can help identify issues like overfitting or underfitting, as well as provide deeper insights into the model’s decision-making process. Check the [How to Extract Training and Prediction Matrices](../user_guides/training-and-prediction-matrices.html) user guide for more information."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "skforecast_py12",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.11"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "184.087px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
